<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
      ES3:构造函数+原型
      
    
    */

      /* function Person(name, age) {
        this.name = name;
        this.age = age;
      }

      Person.prototype.eat = function () {
        console.log("eat");
      };

      Person.hello = "world";

      const p1 = new Person("xiaowang", 18);

      //封装一个学生类,首先继承自Person类
      function Student(name, age, classRoom) {
        //构造函数继承
        Person.call(this, name, age);
        this.classRoom = classRoom;
      }

      //当一个对象找不到某个属性和方法的时候要沿着原型链 向 上一级寻找
      //是通过当前对象的__proto__属性(隐式原型属性)找到上一级
      //上一级是 当前对象的构造函数的原型对象(隐式原型指向其构造函数的原型对象)

      //当student的实例化对象s1需要访问eat方法的时候,s1上没有
      //然后来到了Student的原型对象上(Person的实例化对象目前扮演Student原型对象的身份)
      //相当于来到了Person的实例化对象找,Person的实例化对象没有eat
      //然后沿着__proto__找到Person的原型对象,找到了eat方法
      Student.prototype = new Person;//原型链继承

      //给Student的原型对象(Person的实例化对象)扩展一个新的方法,不会影响Person构造函数的实例化对象
      Student.prototype.study = function () {
        console.log("xuexi");
      };

      const s1 = new Student("xiaowang", 18, 407);
      console.log(s1);
 */
      /* 
        ES6: class类定义
      
      
      */

      //定义一个类
      class Person {
        //构造器函数:当这个类被实例化的时候,会立马调用构造器函数,并接受实例化时传递的参数
        //构造器函数内部的this指向实例化对象
        constructor(name, age) {
          //公有属性
          this.name = name;
          this.age = age;
        }

        //公有方法
        eat() {
          console.log("eat");
        }

        //Person类的静态属性
        static hello = "world";
      }

      class Student extends Person {
        constructor(classRoom) {
          super();
          this.classRoom = classRoom;
        }
      }

      console.log(typeof Person);
      const p1 = new Person("xiaoming", 20);
      console.log(p1);
      console.log(Person.hello);
      const s1 = new Student();
      console.log(s1);
    </script>
  </body>
</html>
